﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Prisa.Entities;
using Prisa.BussinesLogic;
using Microsoft.Practices.Unity;

namespace Prisa.UI
{
    public partial class frmMttoProducto : Form
    {
        [Dependency]
        public IProductoBL productoBL { get; set; }

        [Dependency]
        public ICategoriaBL categoriaBL { get; set; }

        public frmMttoProducto()
        {
            InitializeComponent();
            this.BuildUp();

            cATEGORIABindingSource.DataSource = categoriaBL.GetAllFromCategoria();
        }
        
        bool isNew;

        public Int32 IdProd { get; set; }
        
        private void frmMttoProducto_Load(object sender, EventArgs e)
        {
            if (isNew == false)
            {
                var _producto = productoBL.GetFromProductoById(IdProd);
                _producto.CATEGORIA = categoriaBL.GetFromCategoriaById(_producto.CategoriaId);

                pRODUCTOBindingSource.DataSource = _producto;

                cbCategorias.SelectedValue = _producto.CategoriaId;                
            }                      
        }

        public void Nuevo()
        {
            isNew = true;
            lblNuevoCosto.Visible = false;
            txtNuevoCosto.Visible = false;
            pRODUCTOBindingSource.AddNew();

            costoTextBox.Enabled = false;
            precioTextBox.Enabled = false;
        }

        public void Editar(Int32 id)
        {
            isNew = false;
            lblNuevoCosto.Visible = false;
            txtNuevoCosto.Visible = false;

            var _producto = productoBL.GetFromProductoById(id);
            _producto.CATEGORIA = categoriaBL.GetFromCategoriaById(_producto.CategoriaId);

            pRODUCTOBindingSource.DataSource = _producto;                        
        }

        public void EditarOfCompra(decimal nuevoCosto, Int32 IdProd)
        {
            isNew = false;
            lblNuevoCosto.Visible = true;
            txtNuevoCosto.Visible = true;

            var _producto = productoBL.GetFromProductoById(IdProd);

            _producto.CATEGORIA = categoriaBL.GetFromCategoriaById(_producto.CategoriaId);

            pRODUCTOBindingSource.DataSource = _producto;

            cbCategorias.SelectedValue = _producto.CategoriaId;     

            if (nuevoCosto > _producto.Costo)
            {
                costoTextBox.BackColor= System.Drawing.Color.Red;
                costoTextBox.ForeColor = System.Drawing.Color.White;
                txtNuevoCosto.Text = nuevoCosto.ToString();
            }
            if (nuevoCosto < _producto.Costo)
            {
                costoTextBox.ForeColor = System.Drawing.Color.White;
                txtNuevoCosto.Text = nuevoCosto.ToString();
                costoTextBox.BackColor = System.Drawing.Color.Green;
            }

            if (nuevoCosto == _producto.Costo)
            {
                costoTextBox.ForeColor = System.Drawing.Color.White;
                costoTextBox.BackColor = System.Drawing.Color.Yellow;
                txtNuevoCosto.Text = nuevoCosto.ToString();
            }
            

        }

        private void cbCategorias_Click(object sender, EventArgs e)
        {
            cATEGORIABindingSource.DataSource = categoriaBL.GetAllFromCategoria();
        }

        private void BtnGuardar_Click(object sender, EventArgs e)
        {
            var categoria = cATEGORIABindingSource.Current as CATEGORIA;
            PRODUCTO currentProducto = pRODUCTOBindingSource.Current as PRODUCTO;
                        
            var msg = "ERROR";
            if (currentProducto != null)
            {
                currentProducto.Codigo = codigoTextBox.Text.ToUpper();
                currentProducto.Descripcion = descripcionTextBox.Text.ToUpper();
                if (isNew == true)
                {
                    try
                    {
                        productoBL.AddProducto(currentProducto);
                        MessageBox.Show("Registro Correcto", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        Close();
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                if (isNew == false)
                {
                    try
                    {
                        currentProducto.CATEGORIA = categoria;
                        productoBL.UpdateProducto(currentProducto);
                        Editar(currentProducto.Id);
                        MessageBox.Show("Modificación Correcta", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        Close();
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }

                }
            }
        }

        public void calcularCosto()
        {
            PRODUCTO currentProducto = pRODUCTOBindingSource.Current as PRODUCTO;

            if (cbCategorias.SelectedValue == null)
            {
                sugeridoTextBox.Text = "0.00";
            }
            else 
            {
                
                if (costoTextBox.Text != "")
                {
                    try
                    {
                        var porcentaje = categoriaBL.GetFromCategoriaById(Convert.ToInt32(cbCategorias.SelectedValue.ToString())).Porcentaje.ToString();
                        porcentajeTextBox.Text = categoriaBL.GetFromCategoriaById(Convert.ToInt32(cbCategorias.SelectedValue.ToString())).Porcentaje.ToString();
                        var sugerido  = Convert.ToString(Convert.ToDecimal(costoTextBox.Text) * (1 + Convert.ToDecimal(porcentaje.ToString())));
                        
                        var newSugerido = Math.Round(Convert.ToDecimal(sugerido), 2);
                        sugeridoTextBox.Text = newSugerido.ToString();

                    }
                    catch
                    {
                        MessageBox.Show(this, "Ingrese un monto váliado", "Mensaje",
                                    MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                else
                {
                    sugeridoTextBox.Text = "0.00";
                }
            }
        }

        private void costoTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter )
            {
                calcularCosto();
            }
        }

        private void costoTextBox_TextChanged(object sender, EventArgs e)
        {
                calcularCosto();
        }

        private void cbCategorias_SelectedIndexChanged(object sender, EventArgs e)
        {
            calcularCosto();
        }

        private void btnVerificarDesc_Click(object sender, EventArgs e)
        {
            if (descripcionTextBox.Text.Length > 0)
            {
                VerificarDescripcion();
                costoTextBox.Focus();
            }
            else
            {
                MessageBox.Show(this, "La Descripción es requerida", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                descripcionTextBox.Focus();
            }

        }

        private void VerificarDescripcion()
        {
            #region Add
            if (isNew == true)
            {
                var descripcion = productoBL.GetOneProductoByDescripcion(descripcionTextBox.Text);
                if (descripcion != null)
                {
                    PRODUCTO currentProducto = descripcion as PRODUCTO;
                    pRODUCTOBindingSource.DataSource = descripcion;

                    DialogResult rpta = MessageBox.Show(this, string.Format("Ya existe un Producto con la misma descripción"),
                        "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    if (rpta == DialogResult.OK && isNew == true)
                    {
                        Close();
                    }
                }
                else
                {
                    MessageBox.Show(this, "Descripción disponible", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    costoTextBox.Enabled = true;
                    precioTextBox.Enabled = true;
                }
            }
            #endregion
            #region Update
            else 
            {
                var _producto = pRODUCTOBindingSource.Current as PRODUCTO;
                var existe = productoBL.ExisteDuplicidadProdDescripcion(descripcionTextBox.Text, _producto.Id);
                if (existe)
                {
                    DialogResult rpta = MessageBox.Show(this, string.Format("Ya existe un Producto con la misma descripción"),
                        "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    MessageBox.Show(this, "Descripción disponible", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
            #endregion
        }

        private void descripcionTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if(descripcionTextBox.Text.Length > 0)
                {
                    VerificarDescripcion();
                    costoTextBox.Focus();
                }
                else
                {
                    MessageBox.Show(this, "La Descripción es requerida", "Mensaje",MessageBoxButtons.OK, MessageBoxIcon.Information);
                    descripcionTextBox.Focus();
                }
            }

        }

        private void precioTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (
                !char.IsNumber(e.KeyChar) &&
                !char.IsDigit(e.KeyChar) &&
                e.KeyChar != (char)Keys.Back &&
                e.KeyChar != (char)Keys.Enter
                )
            {
                e.Handled = true;
            }

            if (e.KeyChar == '.' || e.KeyChar == '\b')
            {
                e.Handled = false;
            }
        }

        private void costoTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (
                !char.IsNumber(e.KeyChar) &&
                !char.IsDigit(e.KeyChar) &&
                e.KeyChar != (char)Keys.Back &&
                e.KeyChar != (char)Keys.Enter
                )
            {
                e.Handled = true;
            }

            if (e.KeyChar == '.' || e.KeyChar == '\b')
            {
                e.Handled = false;
            }
        }

        private void codigoTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            var guion = Convert.ToString("-");
            var coma = Convert.ToString(",");
            var punto = Convert.ToString(".");
            var slash = Convert.ToString("/");
            var amber = Convert.ToString("&");

            string cadena = guion + coma + punto + slash + amber + (char)8;
            if (!cadena.Contains(e.KeyChar) && !(char.IsLetter(e.KeyChar)) && !(char.IsNumber(e.KeyChar))
                && (e.KeyChar != (char)Keys.Back) && (e.KeyChar != (char)Keys.Enter) && (e.KeyChar != (char)Keys.Clear)
                && !(char.IsSeparator(e.KeyChar)))
            {
                e.Handled = true;
                return;
            }
        }

        private void descripcionTextBox_KeyPress(object sender, KeyPressEventArgs e)
        {
            var guion = Convert.ToString("-");
            var coma = Convert.ToString(",");
            var punto = Convert.ToString(".");
            var slash = Convert.ToString("/");
            var amber = Convert.ToString("&");

            string cadena = guion + coma + punto + slash + amber + (char)8;
            if (!cadena.Contains(e.KeyChar) && !(char.IsLetter(e.KeyChar)) && !(char.IsNumber(e.KeyChar))
                && (e.KeyChar != (char)Keys.Back) && (e.KeyChar != (char)Keys.Enter) && (e.KeyChar != (char)Keys.Clear)
                && !(char.IsSeparator(e.KeyChar)))
            {
                e.Handled = true;
                return;
            }
        }


        

        


    }
}
